
/* $Id: logfile.c 12 2009-12-29 15:50:19Z calicant $ */

#include "edilana.h"

/*
 *  Controla se c'e' il logfile contandone i nomi e gli anagrammi;
 *  se non lo trova lo crea
 */
void SettaLogfile (char *nomelog, int ContaAnag[])
{
char stemp[MAXSTRLEN], *curs;
FILE *puntlog;

#ifdef __MSDOS__
#define SLASH '\\'
#else
#define SLASH '/'
#endif
#define  COLON ':'

	for (curs = nomelog + strlen(nomelog); --curs > nomelog
		&& *curs != SLASH
		&& *curs != COLON;
	) ;

	if (*curs == SLASH || *curs == COLON)
		strcpy(stemp, curs + 1);
	else strcpy(stemp, nomelog);


/****** proviamo a permettere il path anche a questi sistemi

	#if AMIGA || __MSDOS__
	if (*curs == SLASH || *curs == COLON) {
		IoDico(NO_PATH_IN_LOG);
		strcpy(nomelog, NOMELOG);
	}
	strcpy(stemp, nomelog);
	#endif
******/
	ContaAnag[0] = ContaAnag[1] = ContaAnag[2] = ContaAnag[3] =
	ContaAnag[4] = 0;

	puntlog = IOFile(nomelog,"a+");
	fseek(puntlog,0L,2);
	if (ftell(puntlog) < 3L) {
		int data[6];
		/* prendiamo la data corrente */
		DataOra(data);
		/* stampiamo l'intestazione con data di un nuovo logfile */
		fprintf(puntlog,
			"# %s --- EdilAna logfile --- "
			"%d.%d.%02d\n\n",
			stemp,
			data[0],
			data[1],
			data[2] - (data[2]/100)*100
		);
		/* meglio avvertire su quanto abbiamo fatto */
		IoDico(CREO_LOGFILE);
	}
	else {
		fseek(puntlog,0L,0);
		while(fgets(stemp,MAXSTRLEN,puntlog) != NULL)
			if (*stemp != '#' && strchr(stemp,'=') != NULL) {
				ContaAnag[3]++;
				if (isalpha(*stemp)) ContaAnag[2]++;
			}
	}
	fclose(puntlog);
}

/*
 * Scrive un commento in fondo al logfile.
 */
void CommentoInLog (char *commento, char *nomelog)
{
FILE *puntlog;

	if ((puntlog = IOFile(nomelog, "a+")) == NULL)
		return;
	fprintf(puntlog, "\n%s", commento);
	fclose(puntlog);
}

/*
 *  Estrae l'anagramma dalla linea che lo contiene, lo stampa nel file
 *  specificato, ne controlla la lunghezza, tenendone traccia nel caso
 *  sia maggiore del max lunghezza sinora incontrata
 */
static int stampAnagramma (char *stemp, FILE *pout, int maxl, char *pos0)
{
char anag[MAXSTRLEN];
int l;

	strcpy(anag,pos0+2);
	if ((pos0 = strchr(anag,'\t')) != NULL) {
		*pos0 = '\0';
		strcat(anag,"\n");
	}
	fputs(anag,pout);
	if ((l = strlen(anag)) > maxl) maxl = l;

return maxl;
}

extern struct Setup *conf;

/*
 *  Mostra i nomi presenti nel logfile, oppure gli anagrammi corrispondenti
 *  a un certo nome (di cui si da' eventualmente solo l'inizio)
 */
void MostrAnaInLog (char *nomelog, char *sott, char *NomeCognome)
{
char	stemp[MAXSTRLEN];
char	nome [MAXSTRLEN] = "";
char	*pos, *pos0;
int 	i = OFF, maxl = 0, lung, l, cerco = 0, seleziona = 0;
FILE 	*puntlog, *puntout;

	/* interpretiamo la stringa di comando per sapere che cosa si cerca */
	if (*sott == sott[1]) {
		/* anagrammi che contengono un dato lemma */
		if (isalpha(sott[2])) {
			cerco = 3;
			Stripnl(sott);		 
			strcpy(nome, &sott[2]);
		}
		/* selezione il nome come nuova base */
		else if (sott[2] == *sott && isalpha(sott[3])) {
			cerco = 1;
			seleziona = 1;
			Stripnl(sott);
			strcpy(nome, &sott[3]);
		}
		/* cerco i nomi del logfile */
		else cerco = 1;
	}
	else {	
		/* cerco gli anagrammi di nome specificato */
        	if (Stripnl(sott) > 1)
			strcpy(nome,&sott[1]);
		/* anagrammi del nome corrente */
		else
			strcpy(nome,NomeCognome);
	}

	puntlog = IOFile(nomelog,"r");
	puntout = IOFile(TEMPFILE,"w");
	if (IOFail(puntlog,puntout)) return;

	lung = strlen(nome);

	while(fgets(stemp,MAXSTRLEN,puntlog) != NULL) {
		/*
		 * saltiamo commenti, linee vuote o che non contengono
		 * anagrammi
		 */
		if (*stemp == '#' || *stemp == '\n' ||
			(pos0 = strchr(stemp,'=')) == NULL) continue;

		/* ci interessano i nomi nel logfile */
		if (cerco == 1) {
			if (isalpha(*stemp)) {
				pos = strchr(stemp,'.');
				*(pos-1) = '\0';
				if (seleziona) {
					if (!strncmp(stemp, nome, lung)) {
						*sott = conf->comando[NUOVA_BASE];
						sott[1]	= '\0';
						strcat(sott, stemp);
						strcat(sott, "\n");
						fclose(puntlog);
						fclose(puntout);
						return;
					}
				}
				else {
					l = strlen(stemp);
					strcat(stemp,"\n");
					fputs(stemp, puntout);
					if (l > maxl)
					maxl = l;
				}
			}
		}

		/* ci interessano gli anagrammi di un nome specificato */
		else if (!cerco) {
			/* controlliamo se questo nome va bene */
			if (isalpha(*stemp))
				if (strncmp(stemp,nome,lung) == 0) {
					i = ON;
					maxl = stampAnagramma(stemp,puntout,
						maxl,pos0);
					continue;
				}
			/* abbiamo trovato il nome, ecco gli anagrammi */
			if (i == ON)
				if (*stemp == '\t' || *stemp == '*' ||
					*stemp == ' ') {
					maxl = stampAnagramma(stemp,puntout,
						maxl,pos0);
				}
				else i = OFF;

		}
		/* ci interessano gli anagrammi contenenti una stringa data */
		else if (strstr(strchr(stemp, '='), nome) != NULL)
			maxl = stampAnagramma(stemp,puntout,maxl,pos0);

	} /* end while */

	fclose(puntlog);
	fclose(puntout);

	/* se abbiamo trovato qualcosa lo stampiamo */
	if (maxl)
		StampaCol(TEMPFILE,1,&i,maxl,OFF,OFF,stemp);
	else IoDico(TROVATO_POCO);
}

/*
 *  Mette l'anagramma nel punto trovato da InsertLog. Aggiunge un codice
 *  per esso: anno, mese, giorno, ora, minuto, secondo correnti,
 *  preoccupandosi di allinearlo con tabulatori e spazi.
 */
static void anagInLog (
	FILE *puntout,	/* posizione del file in cui scrivere */
	char *anagramma,/* anagramma da inserire */
	int  data[],	/* data corrente */
	int  flag_nome,	/* se != 0 (nuovo nome) non mette tab iniziali */
	int  flag_data  /* se != 0 inserisce la data dell'anagramma */
)
{
char dstringa[16];
int  val, lung;


	/* toglie '\n' */
	lung = Stripnl(anagramma);

	/* mette i tabulatori soltanto se il loro posto non e' gia'
	 * stato occupato dal nome, prima di stampare l'anagramma
	 */
        fprintf(puntout, "%s%s", flag_nome ? "" : "\t\t\t\t", anagramma);

	if (flag_data) {
		/* crea la stringa con la data di nascita dell'anagramma */
		sprintf(dstringa,"%02d%02d%02d%02d%02d%02d\n",
			data[2],
			data[1],
			data[0],
			data[3],
			data[4],
			data[5]
		);
		/* un po' di conti prima di stampare la data, in modo da
		 * allinearla con tabulatori e spazii.
		 * Queste le assunzioni:
	 	 *                                                colonna 81
	 	 *                                                |
	 	 *   |--------- 32 ---------||--------------------|
	 	 *   nome cognome .......... = anagramma          data
	 	 *
	 	 * tab = 8
	 	 */
		val = (32 + lung) % 8;
		if (val) {
			fprintf(puntout, "\t");
			val = 8 - val;
		}
		/* stampa la data */
		fprintf(puntout, 
			"%.*s%s",
			(49 - lung - val) / 8,
			"\t\t\t\t\t\t\t",
			dstringa
		);
	}
	/* non stampa la data */
	else
		fputs("\n",puntout); 		

}

/*
 *  Inserisce un anagramma nel logfile; se il nome e' gia' presente lo accoda
 *  ai suoi anagrammi precedenti
 */
int InsertLog (char *nome, char *anagramma, char *nomelog, int flag_data)
{
enum 	{NUOVO, TROVATO, AGGIUNTO};
char	linea[MAXSTRLEN];
char	*pos;
int 	i = NUOVO, lung;
int	data[6];
FILE 	*puntlog, *puntout;

	puntlog = IOFile(nomelog,"r");
	puntout = IOFile(TEMPFILE,"w");
	if (IOFail(puntlog,puntout)) return -1;

	if (flag_data) 
		DataOra(data);

	lung = strlen(nome);

	while(fgets(linea,MAXSTRLEN,puntlog) != NULL) {
		/*
		 * nome trovato: prima di aggiungere il nostro anagramma
		 * scriviamo quelli presenti
		 */
		if (i == TROVATO) {
			if (isalpha(*linea)) {
                                anagInLog(puntout,anagramma,data,0,flag_data);
				fputs("\n",puntout);
				fputs(linea,puntout);
				i = AGGIUNTO;
				break;
			}
			else if (*linea != '\n')
				fputs(linea,puntout);
		}
		/* non abbiamo ancora trovato il nome */
		else {
			if (isalpha(*linea)) {
				fputs(linea, puntout);
				pos = strchr(linea,'.');
				*(pos-1) = '\0';
				if (strncmp(linea,nome,lung) == 0)
			 		i = TROVATO;
			}
			else fputs(linea,puntout);
		}
	} /* end while */

	/* abbiamo gia' inserito l'anagramma, scriviamo il resto del file */
	if (i == AGGIUNTO)
		while(fgets(linea,MAXSTRLEN,puntlog) != NULL)
			fputs(linea,puntout);

	/* il nome manca nel logfile: mettiamolo col suo primo anagramma */
	else if (i == NUOVO) {
		fprintf(puntout,"\n%s %.*s ",
			nome,
			30-lung,
			PUNTINI
		);
		anagInLog(puntout,anagramma,data,1,flag_data);
	}
	/* il nome e' presente con uno o piu' anagrammi a fine file, aggiungiamo
	 * ora il nuovo anagramma
	 */
	else if (i == TROVATO)
		anagInLog(puntout,anagramma,data,0,flag_data);

	/* chiudiamo i file e facciamo diventare logfile il nostro file
	 * temporaneo
	 */
	fclose(puntlog);
	fclose(puntout);
	remove(nomelog);
	rename(TEMPFILE,nomelog);

return i;
}
